package cl.tinet.trainee.proyecto.modelo;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.Type;

import cl.tinet.trainee.proyecto.util.MD5;

/**
 * 
 * Clase usada para realizar el map con la tabla usuario.
 * 
 * @author Jose Palma
 */
@Entity
@Table(name = "usuario")
public class Usuario implements Serializable {

    /**
     * serialVersion 1.0.
     */
    private static final long serialVersionUID = 1L;
    /**
     * Alias del usuario.
     */
    @Id
    @Column(name = "username")
    private String username;
    /**
     * Nombre completo.
     */
    @Column(name = "nombre")
    private String nombre;
    /**
     * Password.
     */
    @Column(name = "password")
    private String password;
    /**
     * Tipo de usuario. true Administrador false Normal.
     */
    @Column(name = "tipo_usuario")
    @Type(type = "org.hibernate.type.NumericBooleanType")
    private Boolean tipoUsuario;
    /**
     * Estado del usuario en el sistema. true Activo. false Inactivo.
     */
    @Column(name = "estado")
    @Type(type = "org.hibernate.type.NumericBooleanType")
    private Boolean estado;

    /**
     * 
     * Constructor Usuario. Por defecto los usuarios al momento de ser creados
     * estan activos y con perfil usuario.
     * 
     */
    public Usuario() {
        this.estado = true;
        this.tipoUsuario = false;
    }

    /**
     * 
     * getUsername.
     * 
     * @return username. Alias del usuario.
     */
    public String getUsername() {
        return username;
    }

    /**
     * 
     * setUsername.
     * 
     * @param username
     *            Alias del usuario.
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * 
     * getNombre.
     * 
     * @return Nombre completo del usuario.
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * 
     * setNombre.
     * 
     * @param nombre
     *            Nombre completo del usuario.
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * 
     * getPassword.
     * 
     * @return password String encriptado.
     */
    public String getPassword() {
        return password;
    }

    /**
     * 
     * setPassword.
     * 
     * @param password
     *            String que se encriptara para su almacenamiento.
     */
    public void setPassword(String password) {

        this.password = MD5.getMD5(password);
    }

    /**
     * 
     * getTipoUsuario.
     * 
     * @return true Admin, false Normal.
     */
    public Boolean getTipoUsuario() {
        return tipoUsuario;
    }

    /**
     * 
     * setTipoUsuario.
     * 
     * @param tipoUsuario
     *            true Admin, false Normal.
     */
    public void setTipoUsuario(Boolean tipoUsuario) {
        this.tipoUsuario = tipoUsuario;
    }

    /**
     * 
     * getEstado.
     * 
     * @return true activo, false inactivo.
     */
    public Boolean getEstado() {
        return estado;
    }

    /**
     * 
     * setEstado.
     * 
     * @param estado
     *            true activo, false inactivo.
     */
    public void setEstado(Boolean estado) {
        this.estado = estado;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean equals(Object o) {
        if (o == null) {
            return false;
        } else if (!(o instanceof Usuario)) {
            return false;
        } else if (this.getUsername().equals(((Usuario) o).getUsername())) {
            return true;
        }
        return false;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int hashCode() {
        return super.hashCode();
    }

    /**
     * 
     * Copia los datos de un usuario a otro.
     * 
     * @param usuario
     *            usuario con los datos actualizados.
     */
    public void copiar(Usuario usuario) {
        this.nombre = usuario.getNombre();
        this.tipoUsuario = usuario.getTipoUsuario();
        this.password = usuario.getPassword();
        this.estado = usuario.getEstado();
    }

}
